package leetcode.array_sort.movewindow;

import java.util.ArrayList;
import java.util.List;

/**
 * 给定一个字符串 s 和一个非空字符串 p，找到 s 中所有是 p 的字母异位词的子串，返回这些子串的起始索引。
 * <p>
 * 字符串只包含小写英文字母，并且字符串 s 和 p 的长度都不超过 20100。
 * <p>
 * 说明：
 * <p>
 * 字母异位词指字母相同，但排列不同的字符串。
 * 不考虑答案输出的顺序。
 * <p>
 * 示例 1:
 * <p>
 * 输入:
 * s: "cbaebabacd" p: "abc"
 * <p>
 * 输出:
 * [0, 6]
 * <p>
 * 解释:
 * 起始索引等于 0 的子串是 "cba", 它是 "abc" 的字母异位词。
 * 起始索引等于 6 的子串是 "bac", 它是 "abc" 的字母异位词。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/find-all-anagrams-in-a-string
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * <p>
 * 我们对子串进行索引  使用int[256]  初始情况 p中所有字符频率+1  查找过程中 如果r+1 位置获取到的频率为0 说明遇到的不是子串，l++ 直到 l++位置元素频率为0，则r++
 * 滑动窗口： s[l,r] 每次尝试去++r 直到 r+1<length &&  r+1位置字符不在子串中
 * <p>
 * 不会做
 */
public class Solution438 {
    public List<Integer> findAnagrams(String s, String p) {
        ArrayList<Integer> res = new ArrayList();
        int[] charfreq = new int[256];
        forInitCharFreq(charfreq, p);
        int l = 0, r = -1;
        while (l < s.length()) {
            int count = p.length();
            if (r + 1 < s.length() && charfreq[s.charAt(r + 1)] == 1 && count > 0) {
                r++;
                charfreq[s.charAt(r)] -= 1;
                count--;
            } else {// 遍历结束  r=s.length-1 harfreq[s.charAt(r + 1)] == 0; 没有匹配上  count==0
                //首先需要判断是否已经匹配上了


            }
        }

        return res;
    }

    private void forInitCharFreq(int[] charfreq, String p) {
        for (int i = 0; i < p.length(); i++) {
            charfreq[p.charAt(i)] = 1;
        }
    }
}
